home *** CD-ROM | disk | FTP | other *** search
/ Greenhouse Effect Detection Expriment / NASA Greenhouse Effect Detection Expriment 1992 - Disc 2.iso / software / dos / cdf22pc / src / tools / encode.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-02-26  |  3.4 KB  |  155 lines

  1. /******************************************************************************
  2. *
  3. *  NSSDC/CDF                        Encode CDF things.
  4. *
  5. *  Version 1.0, 25-Feb-92, Hughes STX
  6. *
  7. *  Modification history:
  8. *
  9. *   V1.0  25-Feb-92, J Love       Original version.
  10. *
  11. ******************************************************************************/
  12.  
  13. #include "cdfdist.h"
  14.  
  15. /******************************************************************************
  16. * EncodeValue.  Returns width of encoded value.
  17. ******************************************************************************/
  18.  
  19. int EncodeValue (dataType, value, Evalue)
  20. long dataType;        /* CDF data type. */
  21. void *value;        /* Value to encode. */
  22. char *Evalue;        /* Encoded value. */
  23. {
  24. switch (dataType) {
  25.   case CDF_BYTE:
  26.   case CDF_INT1:
  27.     sprintf (Evalue, "%d", *((Schar *) value));
  28.     return strlen(Evalue);
  29.  
  30.   case CDF_INT2:
  31.     sprintf (Evalue, "%d", *((short *) value));
  32.     return strlen(Evalue);
  33.  
  34.   case CDF_INT4:
  35.     sprintf (Evalue, "%ld", *((long *) value));
  36.     return strlen(Evalue);
  37.  
  38.   case CDF_UINT1:
  39.     sprintf (Evalue, "%u", *((Uchar *) value));
  40.     return strlen(Evalue);
  41.  
  42.   case CDF_UINT2:
  43.     sprintf (Evalue, "%u", *((unsigned short *) value));
  44.     return strlen(Evalue);
  45.  
  46.   case CDF_UINT4:
  47.     sprintf (Evalue, "%lu", *((unsigned long *) value));
  48.     return strlen(Evalue);
  49.  
  50.   case CDF_REAL4:
  51.   case CDF_FLOAT: {
  52.     int n;
  53.     size_t len;
  54.     char *ePtr;
  55.     char temp[80+1];
  56.  
  57.     sprintf (Evalue, "%g", *((float *) value));
  58.     n = strlen(Evalue);
  59.  
  60.     if ((ePtr = strchr(Evalue,'e')) == NULL) {
  61.       if (strchr(Evalue,'.') == NULL) {        /* eg., 0 ---> 0.0 */
  62.     strcat (Evalue,".0");
  63.     n += 2;
  64.       }
  65.     }
  66.     else {
  67.       if (strchr(Evalue,'.') == NULL) {        /* eg., 1e+04 ---> 1.0e+04 */
  68.     len = ePtr - Evalue;
  69.     strncpy (temp, Evalue, len);
  70.     temp[len] = NUL;
  71.     strcat (temp, ".0");
  72.     strcat (temp, ePtr);
  73.     strcpy (Evalue, temp);
  74.     n += 2;
  75.       }
  76.     }
  77.  
  78.     return n;
  79.   }
  80.  
  81.   case CDF_REAL8:
  82.   case CDF_DOUBLE: {
  83.     int n;
  84.     size_t len;
  85.     char *ePtr;
  86.     char temp[80+1];
  87.  
  88.     sprintf (Evalue, "%g", *((double *) value));
  89.     n = strlen(Evalue);
  90.  
  91.     if ((ePtr = strchr(Evalue,'e')) == NULL) {
  92.       if (strchr(Evalue,'.') == NULL) {
  93.     strcat (Evalue,".0");
  94.     n += 2;
  95.       }
  96.     }
  97.     else {
  98.       if (strchr(Evalue,'.') == NULL) {
  99.     len = Evalue - ePtr;
  100.     strncpy (temp, Evalue, len);
  101.     temp[len] = NUL;
  102.     strcat (temp, ".0");
  103.     strcat (temp, ePtr);
  104.     strcpy (Evalue, temp);
  105.     n += 2;
  106.       }
  107.     }
  108.  
  109.     return n;
  110.   }
  111.  
  112.   case CDF_CHAR:
  113.     sprintf (Evalue, "%c", *((Schar *) value));
  114.     return strlen(Evalue);
  115.  
  116.   case CDF_UCHAR:
  117.     sprintf (Evalue, "%c", *((Uchar *) value));
  118.     return strlen(Evalue);
  119.  
  120.   case CDF_EPOCH: {
  121.     struct EPOCH ep;
  122.     ep.tSince0 = *((double *) value);
  123.     strcpy (Evalue, epochString(&ep));
  124.     return strlen(Evalue);
  125.   }
  126. }
  127. return 0;
  128. }
  129.  
  130. /******************************************************************************
  131. * EncodeString.  Returns width of encoded string (include delimeters).
  132. ******************************************************************************/
  133.  
  134. int EncodeString (numChars, string, Estring)
  135. long numChars;        /* Number of characters (elements). */
  136. char *string;        /* String to encode. */
  137. char *Estring;        /* Encoded string. */
  138. {
  139. char delim;
  140. int i;
  141.  
  142. delim = PickDelim (string);
  143.  
  144. Estring[0] = delim;
  145.  
  146. for (i = 0; i < numChars; i++) {
  147.    Estring[i+1] = (isprint(string[i]) ? string[i] : '.');
  148. }
  149.  
  150. Estring[i+1] = delim;
  151. Estring[i+2] = NUL;
  152.  
  153. return strlen(Estring);
  154. }
  155.